/** ============================================================================================== **/
/* 										SOTTOSCRIZIONE EVENTI MAPPA					  			    */	
/** ============================================================================================== **/

BootApplication.controller("SubscriberController",
	[ "$scope", "log", "olMapsInst", "configuration", "NotificheSrv", "$rootScope", "MonitoraggioTplSrv","TPLAgenziaService","$window", 
	  function ( $scope, log, olMapsInst, configuration, NotificheSrv, $rootScope, MonitoraggioTplSrv,TPLAgenziaService,$window) {

		
	if($window.opener != null){
		var ob = $window.opener.MappaGeneraleOnload;
		// oppure
		// var ob = window.MappaGeneraleOnload;
		// la differenza sta nel fatto che con il 1 si fa riferimento all'opener, qundi anche quando si aggiorna la pagina figlia si trova
		// nuovamente l'oggetto che si aspetta
		// nel secondo caso è una variabile usa e getta, al refresh sarà undefined
		angular.element(document).ready(function () {
			if(ob != undefined){
				events.broadcast(ob.eventName, ob.objEvent, $scope.myWorker);
				ob = null;
			}
	    });
	}


 /*******************************************************************************************/
 /*  						 		SOTTOSCRIZIONE AI TOPIC					 				*/
 /*******************************************************************************************/

	/**
	 * Sottoscrizione ad un evento, in questo caso eventoApplicaFiltro, quando verrà invocato eseguirà la funzione
	 * "applicaFiltro" la quale accetta in ingresso l'oggetto utile alla selezione di un'Entità(Es: Spire, ZTl, ecc..) e
	 * all'applicazione di un filtro
	 */
	var subscriptionApplicaFiltro = events.subscribe('eventoApplicaFiltro', function(obj) {
		$scope.status.apiGeocoder.applicaFiltro(obj);
	});

	/**
	 * Sottoscrizione ad un evento, in questo caso è "getDisponibilita", aggiornamento disponibilità parcheggi.
	 * L'aggiornamento rigurada questi campi:
	 *   - postiRealtime
	 *   - dataUltimaRicezione
	 */
	var subscriptionGetDisponibilitaParcheggi = $scope.$on(configuration.getParam("Constants").PARK_MON_REALTIME_DISP_EVT, function(event, obj) {
		/* Find layer associato alla feature */
		var layer = $scope.olMap.getLayerByName(configuration.getParam("Constants").layersName["PARCHEGGI_MONITORAGGIO"]);

		if(angular.isDefined(layer) && layer != null){
			
			/* Controllo se al layer è stata aggiunta la feature originale */
			var feature = layer.getSource().getFeatureById(obj.idParcheggio + "");
			/* Controllo se al layer è stata aggiunta eventuale copia, se si devo rimuoverla */
			var featureClone = layer.getSource().getFeatureById(obj.idParcheggio + "_copy");
	
			/* Rimuovo la copia della feature dal source. */
			if(angular.isDefined(featureClone) && featureClone != null){
				/* Rimuovo la copia della feature dal source, perchè devo riaggiungerla con i dati relatime aggiornati */
				layer.getSource().removeFeature(featureClone);
			}
	
			if(angular.isDefined(feature) && feature != null) {
				var nw = feature.clone();
	
				/* Rimuovo l'originale della feature dal source, perchè devo riaggiungerla con i dati relatime aggiornati */
				layer.getSource().removeFeature(feature);
	
				/* Aggiorno i dati */
				var properties = nw.getProperties();
					properties.postiRealtime = obj.postiDisponibili;
					properties.dataUltimaRicezione = obj.dtagg;
	
				nw.setProperties(properties);
	
				/* la reinserisco in mappa */
				layer.getSource().addFeature(nw);
	
				/*
				 * Aggiorna le proprietà della popup, verificando che ci sia una popup visibile e che si riferisca alla feature con id "properties.id".
				 */
				$scope.refreshPopup(nw, layer.getName());
			}
		}// close layer defined
	});

	/**
	 * Sottoscrizione ad un evento, in questo caso è "bshEvent", aggiornamento disponibilità bike sharing.
	 * L'aggiornamento rigurada questi campi:
	 *   - biciDisponibili
	 *   - biciRotte
	 *   - stalliVuoti
	 *   - stalliRotti
	 *   - dtagg
	 */
	var subscriptionGetDisponibilitaBikeSh = $scope.$on(configuration.getParam("Constants").BSH_MON_REALTIME_DISP_EVT, function(event, obj) {
		/* Find layer associato alla feature */
		var layer = $scope.olMap.getLayerByName(configuration.getParam("Constants").layersName["BIKE_SHARING_MONITORAGGIO"]);

		if(angular.isDefined(layer) && layer != null){
			
			/* Controllo se al layer è stata aggiunta la feature originale */
			var feature = layer.getSource().getFeatureById(obj.id + "");
	
			if(angular.isDefined(feature) && feature != null) {
				var nw = feature.clone();
	
				/* Rimuovo l'originale della feature dal source, perchè devo riaggiungerla con i dati relatime aggiornati */
				layer.getSource().removeFeature(feature);
	
				/* Aggiorno i dati */
				var properties = nw.getProperties();
					properties.datiDisponibilita.biciDisponibili = obj.biciDisponibili;
					properties.datiDisponibilita.biciRotte = obj.biciRotte;
					properties.datiDisponibilita.stalliVuoti = obj.stalliVuoti;
					properties.datiDisponibilita.stalliRotti = obj.stalliRotti;
					properties.datiDisponibilita.dtagg = obj.dtagg;
	
				nw.setProperties(properties);
	
				/* la reinserisco in mappa */
				layer.getSource().addFeature(nw);
	
				/*
				 * Aggiorna le proprietà della popup, verificando che ci sia una popup visibile e che si riferisca alla feature con id "properties.id".
				 */
				$scope.refreshPopup(nw, layer.getName());
			}
		}// close layer defined
	});

	/**
	 * Sottoscrizione ad un evento, in questo caso è "cshEvent", aggiornamento della posizione del veicolo del carsharing
	 * e altre informazioni sul veicolo.
	 * L'aggiornamento rigurada questi campi:
	 *   - geom
	 *   - fuelLevel
	 *   - outsiteStatus
	 *   - insideStatus
	 *   - dtagg
	 */
	var subscriptionGetDisponibilitaCarSh = $scope.$on(configuration.getParam("Constants").CSH_MON_REALTIME_DISP_EVT, function(event, obj) {
		/* Find layer associato alla feature */
		var layer = $scope.olMap.getLayerByName(configuration.getParam("Constants").layersName["CAR_SHARING_VEHICLE_MONITORAGGIO"]);

		if(angular.isDefined(layer) && layer != null){
			
			/* Controllo se al layer è stata aggiunta la feature originale */
			var feature = layer.getSource().getFeatureById(obj.id + "");
	
			if(angular.isDefined(feature) && feature != null) {
				var nw = feature.clone();
	
				/* Rimuovo l'originale della feature dal source, perchè devo riaggiungerla con i dati relatime aggiornati */
				layer.getSource().removeFeature(feature);
	
				/* Aggiorno i dati */
				var properties = nw.getProperties();
					properties.insideStatus = obj.insideStatus;
					properties.outsiteStatus = obj.outsiteStatus;
					properties.fuelLevel = obj.fuelLevel;
	//				properties.geom = obj.geom;
					properties.dtagg = obj.dtagg;
	
				nw.setProperties(properties);
	
				/* la reinserisco in mappa */
				layer.getSource().addFeature(nw);
	
				/*
				 * Aggiorna le proprietà della popup, verificando che ci sia una popup visibile e che si riferisca alla feature con id "properties.id".
				 */
				$scope.refreshPopup(nw, layer.getName());
			}
		}// close layer defined
	});
	
	/**
	 * Sottoscrizione ad un evento, in questo caso è "mioevento", aggiornamento dati di monitoragggio obu.
	 * L'aggiornamento riguarda questi campi:
	 *   - direzioneGps
	 *   - distanzaOdometro
	 *   - velocitaGps
	 *   - velocitaOdometro
	 *   - dataRilascio
	 */
	var subscriptionMonitoraggioObu = $scope.$on("mioevento", function(event, obj) {
		/* Find layer associato alla feature */
		var layer = $scope.olMap.getLayerByName(configuration.getParam("Constants").layersName["OBU_MONITORAGGIO"]);

		if(angular.isDefined(layer) && layer != null){
			
			/* Controllo se al layer è stata aggiunta la feature originale */
			var feature = layer.getSource().getFeatureById(obj.id + "");
	
			if(angular.isDefined(feature) && feature != null) {
				var nw = feature.clone();
	
				/* Rimuovo l'originale della feature dal source, perchè devo riaggiungerla con i dati relatime aggiornati */
				layer.getSource().removeFeature(feature);
	
				/* Aggiorno i dati */
				var properties = nw.getProperties();
					properties.direzioneGps = obj.direzioneGps;
					properties.distanzaOdometro = obj.distanzaOdometro;
					properties.velocitaGps = obj.velocitaGps;
					properties.velocitaOdometro = obj.velocitaOdometro;
					properties.dataRilascio = obj.dataRilascio;
	
				nw.setProperties(properties);
	
				/* la reinserisco in mappa */
				layer.getSource().addFeature(nw);
	
				/*
				 * Aggiorna le proprietà della popup, verificando che ci sia una popup visibile e che si riferisca alla feature con id "properties.id".
				 */
				$scope.refreshPopup(nw, layer.getName());
			}
		}// close layer defined
	});
	
	/**
	 * Sottoscrizione ad un evento, in questo caso è "chDisponibilitaASosta", aggiornamento disponibilità posti auto per le aree di sosta.
	 * L'aggiornamento riguarda questi campi:
	 *   - postiDisponibili
	 *   - dataRicezione
	 */
	var subscriptionGetDisponibilitaAreeSosta = $scope.$on(configuration.getParam("Constants").ASOSTA_CHANNEL_PTYPE, function(event, obj) {
		/* Find layer associato alla feature */
		var layer = $scope.olMap.getLayerByName(configuration.getParam("Constants").layersName["AREE_DI_SOSTA_MONITORAGGIO"]);

		if(angular.isDefined(layer) && layer != null){
			
			/* Controllo se al layer è stata aggiunta la feature originale */
			var feature = layer.getSource().getFeatureById(obj.areaSosta.id + "");
			/* Controllo se al layer è stata aggiunta eventuale copia, se si devo rimuoverla */
			var featureClone = layer.getSource().getFeatureById(obj.areaSosta.id + "_copy");
	
			/* Rimuovo la copia della feature dal source. */
			if(angular.isDefined(featureClone) && featureClone != null){
				/* Rimuovo la copia della feature dal source, perchè devo riaggiungerla con i dati relatime aggiornati */
				layer.getSource().removeFeature(featureClone);
			}
	
			if(angular.isDefined(feature) && feature != null) {
				var nw = feature.clone();
	
				/* Rimuovo l'originale della feature dal source, perchè devo riaggiungerla con i dati relatime aggiornati */
				layer.getSource().removeFeature(feature);
	
				/* Aggiorno i dati */
				var properties = nw.getProperties();
					properties.postiDisponibili = obj.areaSosta.postiDisponibili;
					properties.dataRicezione = obj.areaSosta.dataRicezione;
	
				nw.setProperties(properties);
	
				/* la reinserisco in mappa */
				layer.getSource().addFeature(nw);
	
				/*
				 * Aggiorna le proprietà della popup, verificando che ci sia una popup visibile e che si riferisca alla feature con id "properties.id".
				 */
				$scope.refreshPopup(nw, layer.getName());
			}
		}// close layer defined
	});

	/**
	 * Sottoscrizione all' evento per il monitoraggio del Trasporto Pubblico.
	 */
	$rootScope.$on(configuration.getParam("Constants").MONITORAGGIO_TPL_CORSA_MAPPA_ESTERNA, function(_event, _element) {		
		MonitoraggioTplSrv.addTrip(_element, $scope.olMap);
	});
	
	/**
	 * INIZIO EVENTI NOTIFICHE SINOTTICO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_NOTIFICA_ALERT'), function(_event, _data) {
		//SI FA BROADCAST SU EVENTI TIPO NOTIFICA
		//SI METTE IN ASCOLTO  ANCHE NotificheController.js
		$rootScope.$broadcast(_data.type, _data);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA DISTANZA PUNTO FISSO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_DISTANZA_PUNTO_FISSO'), function(_event, _data) {
		NotificheSrv.drawNotificaDisatnzaPuntoFisso(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA AREA PROTETTA
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_AREA_PROTETTA'), function(_event, _data) {
		NotificheSrv.drawNotificaAreaProtetta(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA SEMAFORO GUASTO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_SEMAFORO_GUASTO'), function(_event, _data) {
		NotificheSrv.drawNotificaSemaforoGuasto(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA SEMAFORO RIPARATO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_SEMAFORO_RIPARATO'), function(_event, _data) {
		NotificheSrv.drawNotificaSemaforoRiparato(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA INCENDIO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_INCENDIO'), function(_event, _data) {
		NotificheSrv.drawNotificaIncendio(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA INCENDIO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_TERMINE_INCENDIO'), function(_event, _data) {
		NotificheSrv.drawNotificaTermineIncendio(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA TERMINE INCENDIO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_TERMINE_INCENDIO'), function(_event, _data) {
		NotificheSrv.drawNotificaTemineIncendio(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA ARMA DA FUOCO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_ARMA_DA_FUOCO'), function(_event, _data) {
		NotificheSrv.drawNotificaArmaDaFuoco(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA RITARDO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_RITARDO'), function(_event, _data) {
		NotificheSrv.drawNotificaRitardo(_data, $scope.olMap);
	});
	/**
	 * DISEGNO SU MAPPA DI NOTIFICA ALLARME MEZZO
	 */
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_ALLARME_MEZZO'), function(_event, _data) {
		NotificheSrv.drawNotificaAllarmeMezzo(_data, $scope.olMap);
	});
	// TODO INSERIRE QUI GLI ALTRI EVENTI
	/** CORSA **/
	$rootScope.$on(configuration.getParam("Constants").MONITORAGGIO_TPL_CORSA_MAPPA_ESTERNA, function(_event, _element) {
		MonitoraggioTplSrv.addTrip(_element, $scope.olMap);
	});
	$rootScope.$on(configuration.getParam("Constants").MONITORAGGIO_TPL_CORSA_MAPPA_ESTERNA_RESTORE, function(_event, _element) {
		MonitoraggioTplSrv.restoreTrip(_element, $scope.olMap);	
	});
	$rootScope.$on(configuration.getParam("Constants").MONITORAGGIO_TPL_CORSA_MAPPA_ESTERNA_RIMUOVI, function(_event, _element) {
		MonitoraggioTplSrv.removeTrip(_element, $scope.olMap);	
	});

	/** EVENTO **/
	$rootScope.$on(configuration.getParam("Constants").MONITORAGGIO_TPL_EVENTO_MAPPA_ESTERNA, function(_event, _element) {
		MonitoraggioTplSrv.addEvento(_element, $scope.olMap);
	});
	$rootScope.$on(configuration.getParam("Constants").MONITORAGGIO_TPL_EVENTO_MAPPA_ESTERNA_RIMUOVI, function(_event, _element) {
		MonitoraggioTplSrv.removeEvento(_element, $scope.olMap);	
	});
		
	/** ANOMALIE **/
	$rootScope.$on(configuration.getParam("Constants").MONITORAGGIO_TPL_ANOMALIA_MAPPA_ESTERNA, function(_event, _element) {
		MonitoraggioTplSrv.addAnomalia(_element, $scope.olMap);
	});
	$rootScope.$on(configuration.getParam("Constants").MONITORAGGIO_TPL_ANOMALIA_MAPPA_ESTERNA_RIMUOVI, function(_event, _element) {
		MonitoraggioTplSrv.removeAnomalia(_element, $scope.olMap);	
	});
	MonitoraggioTplSrv.initLayerMezzi($scope.olMap);	
//Si prendono le agenzie associate e si lancia il monitoring per ogni agency
	TPLAgenziaService.listFK().then(function(_data){
										if(_data){
											_agencies = _data;
											for(_idx in _agencies){
												_agency = _agencies[_idx];
												$rootScope.$broadcast(configuration.getParam("Constants").MONITORAGGIO_TPL_CORSA_MAPPA_ESTERNA
														             ,{agencyId: _agency.id}
												                      );
											}
										}
	                                }
			                       );
}]);

